/*  GAUSS code                                                               */
/*  File: resnh-HONG-JRSS.txt                                                */
/*                                                                           */
/*  THIS IS A GAUSS PROGRAM FOR COMPUTING P-VALUES OF RESIDUAL TIME SERIES   */
/*  BASED ON THE JRRS-B PAPER BY HONG (2000)                                 */
/*                                                                           */
/*  Reference:                                                               */
/*  Hong, Y. (2000).                                                         */
/*    Generalized spectral tests for serial dependence.                      */
/*    Journal of the Royal Statistical Society, B 62(3), 557--574.           */
/*    DOI: 10.1111/1467-9868.00250.                                          */  
/*                                                                           */
/*  ORIGINAL VERSION DUE TO HONG (2000) USING ASYMPTOTIC CRITICAL VALUES     */
/*  MODIFIED FOR BOOTSTRAPPING, OCTOBER 2012                                 */
/*****************************************************************************/
new;

/* Empirical applications */

/* CHANGE 1: Subdirectory */

load Y0[103,1]=c:\ ... \resnh_n103.dat;

/* SAMPLE SIZE AND MAXIMUM LAG NUMBER */

N=rows(Y0);
Pmax=10;

INDEXP=zeros(Pmax,1);
INDEX1=ones(Pmax,1);
j=1;
do until j==Pmax+1;
   INDEXP[j,1]=j;
   j=j+1;
endo;

/* Seed numbers */

iseed1=2555130;
iseed2=2660427;
iseed3=2552818;

/* WEIGHT FOR NEW GCV AND GKS TESTS */

/* GCV: WEIGHTING */

Wgcv=zeros(n-1,1);

j=1;
do until j==n;
   Wgcv[j,1]=(n-j)/(j*pi)^2;
   j=j+1;
endo;

/* ANDERSON'S CV WEIGHTING */

/* WEIGHTING */

Wcv=zeros(n-1,1);
j=1;
do until j==n;
   Wcv[j,1]=n/(j*pi)^2;
   j=j+1;
endo;

/* HONG'S NEW GKS TEST */

/* Grid Points for Frequencies */

N2=100;

V=zeros(1,N2);
j=1;
do until j==N2+1;
   V[1,j]=j/N2;
   j=j+1;
endo;

Wgks=zeros(N-1,N2);
j=1;
do until j==N;
   Wgks[j,.]=sqrt(N-j)*sqrt(2)*sin(j*pi*V)/(j*pi);
   j=j+1;
endo;


/* ANDERSON'S KS TEST */

/* Grid Points for Frequencies */

N2=100;

V=zeros(N2,1);
j=1;
do until j==N2+1;
   V[j,1]=j/N2;
   j=j+1;
endo;

j=1;
Wks=zeros(N2,N-1);
do until j==N;
   Wks[.,j]=sqrt(N)*sqrt(2)*sin(j*pi*V)/(j*pi);
   j=j+1;
endo;


/* HONG'S JRSSB TEST */

/* KERNEL FUNCTIONS */

/* DANIELL KERNEL */

PROC Wdan(u);
LOCAL Y;
Y=sin(pi*u)./(pi*u);
RETP(Y);
ENDP;

Kdan=zeros(N-1,Pmax);

p=1;
do until p==Pmax+1;
   j=1;
   do until j==N;
      Kdan[j,p]=Wdan(j/(p+1));
      j=j+1;
   endo;
   p=p+1;
endo;

/* NOTE: CK and DK are row 1 by Pmax vectors */

K=Kdan;
K2=K^2;
CK=sumc(K2);
CK=CK';
K4=K2[1:N-2,.]^2;
DK=sumc(K4);
DK=DK';

/* WEIGHTING FOR SKAUG AND TJOSTHEIM TEST */

/* ORIGINAL FORM */

W1st=zeros(Pmax,Pmax);
p=1;
do until p==Pmax+1;
   j=1;
   do until j==p+1;
      W1st[j,p]=(N-1);
      j=j+1;
   endo;
   p=p+1;
endo;

/* ALTERNATIVE FORM OF SKAUG-TJOSTHEIM */

W2st=zeros(Pmax,Pmax);
p=1;
do until p==Pmax+1;
   j=1;
   do until j==p+1;
      W2st[j,p]=N-j;
      j=j+1;
   endo;
   p=p+1;
endo;


/* BOOTSTRAP SAMPLE SIZE B0max 1000*/
B0max=1000;

B0=0;

do until B0==B0max+1;   /*  START BOOTSTRAPPING LOOP */

if B0==0; 

/* ORIGINAL ESTIMATED RESIDUALS */

X=Y0;

else;

/* Generate a single resample from the original data */

X=zeros(N,1);
n=rows(Y0);
Z=ones(n,1);
U = rndu(n,1);
I = trunc(n*U + Z);
Y=I;
i=1;
do until i==n+1;
   X[i] = Y0[Y[i],1];
i=i+1;
endo;

endif;


/* COMPUTING TEST STATISTICS */

/* SUBVECTORS */

/* t=j+1 to N */

PROC X1(j);
LOCAL Y;
Y=X[j+1:N,1];
RETP(Y);
ENDP;

/* t=1 to N-j */

PROC X2(j);
LOCAL Y;
Y=X[1:N-j,1];
RETP(Y);
ENDP;

/* HONG'S NEW GCV TEST */

/* COMPUTE HONG'S MEASURE */

PROC F1(u,j);
LOCAL Y;
Y=(u'-X1(j).>=0);
Y=meanc(Y); /* This sums over X1(j) */
RETP(Y);
ENDP;

PROC F2(v,j);
LOCAL Y;
Y=(v'-X2(j).>=0);
Y=meanc(Y); /* This sums over X2(j) */
RETP(Y);
ENDP;

PROC F(u,v,j);
LOCAL Y;
Y=(u-X1(j)'.>=0)*(v'-X2(j).>=0);
RETP(Y/(N-j)); /* This sums over j */
ENDP;

/* HONG'S MEASURE */

PROC S1(j);
LOCAL Y;
Y=F(X,X,j)-F1(X,j)*F2(X,j)';
Y=meanc(meanc(Y.*Y));
RETP(Y);
ENDP;

S1cvm=zeros(n-1,1);
j=1;
do until j==N;
S1cvm[j,1]=S1(j);
j=j+1;
endo;

GCV=Wgcv'S1cvm;

/* ANDERSON'S CV TEST */

Xm=meanc(X);
COV0=(X-Xm)'(X-Xm);

PROC COV(j);
LOCAL Y;
Y=(X1(j)-Xm)'(X2(j)-Xm);
RETP(Y);
ENDP;

Corr=zeros(n-1,1);
j=1;
do until j==N;
Corr[j,1]=COV(j);
j=j+1;
endo;

Corr=Corr./COV0;
CV=Corr.*Corr;

CV=Wcv'CV;

/* HONG'S GKS TEST */

j=1;
do until j==N;

/* Sj is a N^2 by 1 vector */

Sj=vec(F(X,X,j)-F1(X,j)*F2(X,j)');

/* Y is a N^2 x N2 matrix */

if j==1;
   Y=Sj*Wgks[j,.];
else;
   Y=Y+Sj*Wgks[j,.];
endif;
  j=j+1;
endo;

/* THIS IS GKS STATISTIC */

Y=abs(Y);

GKS=maxc(maxc(Y));

/* ANDERSON'S KS TEST */

KS=abs(Wks*Corr);
KS=maxc(KS);

GCV=GCV*index1;
CV=CV*index1;
GKS=GKS*index1;
KS=KS*index1;

/* DELGADO TEST */

/* XP is a N-p x 1 vector */

PROC XP(j,p);
RETP(X[j:N-p+j-1,1]);
ENDP;

PROC DEGAL(p);
LOCAL Y1,Y2,Y,j;
j=1;
do until j==p+2;
   Y=XP(j,p);
   Y=(Y-Y'.<=0);
   if j==1;
      Y1=Y;
      Y2=meanc(Y);
   else;
      Y1=Y1.*Y;
      Y2=Y2.*meanc(Y);
   endif;
   j=j+1;
endo;
Y=meanc(Y1)-Y2;
Y=Y'Y;
RETP(Y);
ENDP;

DSTAT=zeros(1,Pmax);
p=1;
do until p==Pmax+1;
   DSTAT[1,p]=DEGAL(p);
   p=p+1;
endo;

/* HONG'S JRSSB TEST */

/* JOINT EDF */

/* COMPUTE HOEFFDING MEASURE */

PROC HMj(j);
LOCAL Y1,Y2,Y;
Y1=(X1(j)-X1(j)'.<=0);
Y2=(X2(j)-X2(j)'.<=0);
Y=meanc(Y1.*Y2)-meanc(Y1).*meanc(Y2);
RETP(Y'Y/(n-j));
ENDP;

HM=zeros(1,N-1);
STM=HM;
j=1;
do until j==N;
   STM[1,j]=HMj(j);
   HM[1,j]=(N-j)*STM[1,j];
   j=j+1;
endo;

/* Hstat is a 1 by Pmax vector */

Hstat=90*(HM*K2-CK/36)./sqrt(2*Dk);

/* SKAUG AND TJSOTHEIM 1993 BIOMETRIKA TEST */
/* W1st is original form */
/* W2st is alternative form */

/* THIS is a 1 by Pmax vector */

ST1=STM[1,1:Pmax]*W1st;
ST2=STM[1,1:Pmax]*W2st;

STAT1=GCV[1]~CV[1]~GKS[1]~KS[1];
STAT2=Dstat~Hstat~ST1~ST2;
STAT=STAT1~STAT2;

if B0==0;

/* ORIGINAL TEST STATISTICS */

STAT0=STAT;

endif;

/* BOOTSTRAP STATISTCS */

if B0==1;

STATcum=STAT;

elseif B0>1;

STATcum=STATcum|STAT;

endif;


B0=B0+1;
endo;         /* END BOOTSTRAP LOOP */

/* COMPUTE BOOSTRAP P-VALUES */
/* FIRST USE COUNT METHOD with Uncentered Test Statistics */

PV1=(STAT0-STATcum.<0);

PV1=meanc(PV1);

PV=PV1';

/* PLEASE CHANGE THIS SUBDIRECTORY TO FIT YOUR COMPUTER: THIS IS THE ONLY CHANGE */
/* Output: 4 +(Pmax * 4) vector of p-values */    

output file=c:\ao-kl-statistic\cygwin-remillard\jan\resnh_n103.out  on;

/*  P values based on Bmax bootstrap replicates                               */
/*  THIS IS a 4 +(Pmax * 4) vector with                                       */
/*  first four values: GCV = Hong's generalized Cramer-von Mises, L2-norm;    */
/*                     CV  = Cramer von Mises, Anderson's KS test;            */
/*                     GKS = generalized KS test supremum norm;               */
/*                     KS  = Kolmogorov Smirnov sup norm                      */
/*  Next: 1st Pmax values for Delgado, 2nd Hong JRSSB Hoefding;               */
/*        3rd Skaug-Tjostheim, 4th Skaug-Tjostheim                            */
/*  with lag = Pmax                                                           */

output off; 
